/*
 * Copyright 2004-2006 公司名
 * 本软件及其所有拷贝的名称，与光盘上或本软件中注明的公司同在。
 * 本软件及文档享有版权，并受国家版权法及国际协约条款的保护。
 * 您不可以从本软件中去掉其版权声明；并保证为本软件的拷贝（本部或部分）复制版权声明。
 * 您同意制止以任何形式非法拷贝本软件及文档。
 * 版权信息参见：
 *      http://www.companyname.cn/licenses
 */

package com.companyname.common.sysframe.model;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

import org.apache.log4j.Logger;

import com.companyname.common.base.model.BaseObject;
import com.companyname.common.base.util.BaseObjectPriAscComparator;
import com.companyname.common.viewframe.define.ColumnType;
import com.companyname.common.viewframe.model.Area;
import com.companyname.common.viewframe.model.Column;
import com.companyname.common.viewframe.model.Home;

/**
 * <p>Title: 单元 </p>
 * <p>Description: 机构 Org </p>
 * <p>Copyright: Copyright (c) 2004-2006</p>
 * <p>Company: 公司名</p>
 * @ $Author: 作者名 $
 * @ $Date: 创建日期 $
 * @ $Revision: 1.0 $
 * @ created in 创建日期
 *
 */

public abstract class Unit extends BaseObject
                           implements Serializable
{
        static Logger logger = Logger.getLogger(Unit.class);
        
        private Set homes;
        
        private Set areas;
        
        private Set columns;

        /**
         * @return 返回 areas。
         */
        public Set getAreas()
        {
                return areas;
        }

        /**
         * @param areas 要设置的 areas。
         */
        public void setAreas(Set areas)
        {
                this.areas = areas;
        }
        
        public void addArea(Area area)
        {
                if(this.areas == null)
                {
                        this.areas = new LinkedHashSet();
                }
                this.areas.add(area);
        }

        /**
         * @return 返回 columns。
         */
        public Set getColumns()
        {
                return columns;
        }

        /**
         * @param columns 要设置的 columns。
         */
        public void setColumns(Set columns)
        {
                this.columns = columns;
        }
        
        public void addColumn(Column column)
        {
                if(this.columns == null)
                {
                        this.columns = new LinkedHashSet();
                }
                this.columns.add(column);
        }
        
        // 取得授权的二级栏目
        public Set getColumn2s()
        {
                Set c2s = new LinkedHashSet();
                Object[] cs = this.columns.toArray();
                for(int i = 0; i < cs.length; i ++)
                {
                        Column c = (Column)cs[i];
                        if(c.getType() == ColumnType.TWO_LEVEL)
                        {
                                c2s.add(c);
                        }
                }
                return c2s;
        }
        
        // 取得授权的一级栏目
        public Set getColumn1s()
        {
                Set c1s = new LinkedHashSet();
                Object[] cs = this.columns.toArray();
                for(int i = 0; i < cs.length; i ++)
                {
                        Column c = (Column)cs[i];
                        if(c.getType() == ColumnType.ONE_LEVEL)
                        {
                                c1s.add(c);
                        }
                }
                return c1s;
        }

        /**
         * @return 返回 homes。
         */
        public Set getHomes()
        {
                return homes;
        }

        /**
         * @param homes 要设置的 homes。
         */
        public void setHomes(Set homes)
        {
                this.homes = homes;
        }
        
        public void addHome(Home home)
        {
                if(this.homes == null)
                {
                        this.homes = new LinkedHashSet();
                }
                this.homes.add(home);
        }
        
        // 取得到根的路径
        public abstract List getUnits2Root();

        // 取得授权的主页
        public List getAuthorizedHomes(boolean isSort)
        {
                Set adHomes = new LinkedHashSet();
                List parentUnits = this.getUnits2Root();
                for(int i = 0; i < parentUnits.size(); i ++)
                {
                        Unit unit = (Unit)parentUnits.get(i);
                        adHomes.addAll(unit.getHomes());
                }// for i
                List ahs = new ArrayList(adHomes);
                if(isSort)
                {
                        Collections.sort(ahs,new BaseObjectPriAscComparator());
                }
                return ahs;
        }
        
        // 取得授权的分区
        public List getAuthorizedAreas(boolean isSort)
        {
                Set adAreas = new LinkedHashSet();
                List parentUnits = this.getUnits2Root();
                for(int i = 0; i < parentUnits.size(); i ++)
                {
                        Unit unit = (Unit)parentUnits.get(i);
                        adAreas.addAll(unit.getAreas());
                }// for i
                List aas = new ArrayList(adAreas);
                if(isSort)
                {
                        Collections.sort(aas,new BaseObjectPriAscComparator());
                }
                return aas;
        }
        
        // 取得授权的栏目
        public List getAuthorizedColumns(boolean isSort)
        {
                Set adColumns = new LinkedHashSet();
                List parentUnits = this.getUnits2Root();
                logger.debug(this.getClass().getName()  + " 到根的长度:" + parentUnits.size());
                for(int i = 0; i < parentUnits.size(); i ++)
                {
                        Unit unit = (Unit)parentUnits.get(i);
                        logger.debug(this.getClass().getName()  + " 被授权栏目共" + unit.getColumn1s().size());
                        adColumns.addAll(unit.getColumns());
                }// for i
                List acs = new ArrayList(adColumns);
                if(isSort)
                {
                        Collections.sort(acs,new BaseObjectPriAscComparator());
                }
                return acs;
        }
        
}
